package com.gouaixin.bee.beeframework2.model;

import android.content.Context;
import android.content.Intent;
import android.media.AudioManager;
import android.media.SoundPool;
import android.util.Log;

import com.gouaixin.bee.beeframework2.tool.mLog;
import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;
import com.gouaixin.bee.beeframework2.MyAPI;
import com.gouaixin.bee.beeframework2.MyConfig;
import com.gouaixin.bee.beeframework2.MySharePreference;
import com.gouaixin.bee.beeframework2.R;
import com.gouaixin.bee.beeframework2.bean.MSG;
import com.gouaixin.bee.beeframework2.bean.TulingText;
import com.gouaixin.bee.beeframework2.bean.USER;
import com.gouaixin.bee.beeframework2.dao.MsgDao;
import com.gouaixin.bee.beeframework2.bean.getMessageResponse;
import com.gouaixin.bee.beeframework2.bean.BaseModel;
import com.gouaixin.bee.beeframework2.service.MyService;
import com.gouaixin.bee.beeframework2.tool.PreferencesUtils;
import com.lidroid.xutils.http.RequestParams;

import java.text.SimpleDateFormat;
import java.util.Date;

import cn.bmob.v3.BmobQuery;
import cn.bmob.v3.BmobUser;
import cn.bmob.v3.listener.GetListener;

/**
 * Created by Administrator on 2015/4/8.
 */
//聊天功能控制器
public class ChatModel {



    //在发送消息前，判断当前的会员类型，并做出相应处理
    public static void toNextMemberType(final Context context, final String jname) {
        //6.延时5分钟后，启动杀不死的服务
        mLog.e("延时5分钟后，启动杀不死的服务");



        //设置服务初始时间
        boolean haveTuisong= PreferencesUtils.getBoolean(context, "haveTuisong", false);
        if(haveTuisong==false){
            PreferencesUtils.putBoolean(context,"haveTuisong",true);
            PreferencesUtils.putLong(context,"initTime",System.currentTimeMillis());

            mLog.e("启动杀不死的服务:时间=" + MyConfig.Push_first);
            Intent intent = new Intent();
            intent.setClass(context, MyService.class);
            context.startService(intent);


//            new Handler().postDelayed(new Runnable() {
//                @Override
////                public void run() {

//                }
//            }, MyConfig.Push_first);
        }

        //清空y币
        MemberModel.removeAllYbi(context);

        BmobQuery<USER> query = new BmobQuery<USER>();
        query.getObject(context, BmobUser.getCurrentUser(context).getObjectId(), new GetListener<USER>() {
            @Override
            public void onSuccess(USER user) {
                mLog.e("进行会员类型判断：");
                mLog.e("jname=" + jname);
                //当什么都没开通时,跳转包月
                if (user.getBaoyueType() == 0 && user.getYbiType() == 0 && user.getVipType() == 0 && user.getAbiType() == 0 && user.getHongniangType() == 0) {
                    mLog.e("什么都没开通,跳转包月");
                    DialogModel.toBaoyue(context, "");
                }
                //当开通了Y币时,跳转包月
                else if (user.getYbiType() > 0) {
                    mLog.e("跳转包月");
                    DialogModel.toBaoyue(context, "");
                }
                //当开通了包月时，跳转VIP
                else if (user.getBaoyueType() > 0) {
                    //当开通了VIP时，跳转爱币
                    if (user.getVipType() > 0) {
//                        mLogUtil.e("跳转爱币");
//                        mLogUtil.e("jname1=" + jname);
//                        DialogModel.toAibi(context, jname);
                        //当开通了爱币时，跳转红娘
                        if (user.getAbiType() > 0) {
//                            mLogUtil.e("跳转爱币");
//                            mLogUtil.e("jname2=" + jname);
//                            DialogModel.toAibi(context, jname);
                            Log.e("test", "当开通了爱币时，跳转红娘");
                            mLog.e("跳转红娘");
                            DialogModel.toHongliang(context, "");
                        } else {
                            mLog.e("跳转爱币");
                            mLog.e("jname1=" + jname);
                            DialogModel.toAibi(context, jname);
                        }


                    } else {
                        mLog.e("跳转VIP");
                        DialogModel.toVIP(context, "成为vip会员后才能使用开始更多功能并领取返回话费", false);
                    }
                }

                //当开通了爱币时，跳转红娘
                else if (user.getAbiType() > 0) {
                    Log.e("test", "当开通了爱币时，跳转红娘");

                    mLog.e("跳转红娘");
                    DialogModel.toHongliang(context, "");


                }
                //当开通了红娘时，跳转VIP
                else if (user.getHongniangType() > 0) {
                    if (user.getVipType() > 0) {

                    } else {
                        mLog.e("跳转VIP");
                        DialogModel.toVIP(context, context.getResources().getString(R.string.hongliang_vip), false);
                    }

                }
                if (mLister != null) {
                    mLister.onSuccess(user);
                }
            }

            @Override
            public void onFailure(int i, String s) {

            }
        });
    }


    /**
     * 判断是否可以发送消息
     * 1.判断是否isOver(一旦isOver，和任何机器人均不能聊天，弹出包月对话框)
     * 2.判断当前jid的聊天次数A和真心话次数B,是否A+B>=8&B>=1（一旦满足，设置isOver为true,弹出包月对话框）
     *
     * @param context
     * @param jid
     * @return
     */
    public final static int canSend = 1;//能发消息
    public final static int nocanSend = 0;//不能发消息
    public final static int toSendMoney = 2;//去送话费

    public interface MCallback {
        public void onCallBack(int type);
    }

    public static void getSendable(final Context context, String jid, final MCallback mCallback) {
        //1.判断是否isOver

        boolean isOver = PreferencesUtils.getBoolean(context, MySharePreference.isOver, false);
        mLog.e(MySharePreference.isOver + "=" + isOver);
        if (isOver) {
            mCallback.onCallBack(nocanSend);
            return;
        }
        //2.判断和jid聊天的次数/真心话的次数
        final int A = PreferencesUtils.getInt(context, jid + "LiaoCi", 0);
        final int B = PreferencesUtils.getInt(context, jid + "ZhenCi", 0);

        mLog.e(jid + "LiaoCi=" + A + "\t" + "ZhenCi=" + B);

        MemberModel.getUSER(context, new MemberModel.GetUserLister() {
            @Override
            public void onSuccess(USER user) {
                Log.e("test", "getSendable：\tA=" + A + "\tSystem.currentTimeMillis()=" + System.currentTimeMillis() + "\tuser.getVipEndTime()=" + user.getVipEndTime());
//                if (A==1&&System.currentTimeMillis()<user.getVipEndTime()) {
//                    //去送话费
//                    Log.e("test", "getSendable:去送话费");
//                    mCallback.onCallBack(toSendMoney);
//                    return;
//                }else
//                if (A + B >= 8 && B >= 1||user.getYbiType()<=0&&user.isYbiIsStart()==true) {
                if (A + B >= 5||user.getYbiType()<=0&&user.isYbiIsStart()==true) {
                    //当前用户不可再聊天
                    Log.e("test", "getSendable:当前用户不可再聊天");
                    PreferencesUtils.putBoolean(context, "isOver", true);
                    mCallback.onCallBack(nocanSend);
                    return;
                } else {
                    Log.e("test", "getSendable:当前用户可以聊天");
                    mCallback.onCallBack(canSend);
                    return;
                }
            }

            @Override
            public void onFailure(int i, String s) {

            }
        });
    }


    /**
     * 给一个机器人发消息(消息已封装好)
     * 1.添加消息到网络
     * 2.添加消息到本地
     */
    public static void send(final Context context, MSG bean) {
        //1.添加消息到网络消息表
        BaseModel.setCallBackLister(new BaseModel.CallBackLister() {
            @Override
            public String onCallBack(String url, String data) {
                if (mfindFaceLister != null) {
                    mfindFaceLister.haveFindFace();
                }

                return url;
            }
        });
        RequestParams params = new RequestParams();
        params.addBodyParameter("id", bean.getJid());
        params.addBodyParameter("cid", bean.getCid());
        params.addBodyParameter("text", bean.getContent());
        params.addBodyParameter("time", bean.getTime());
        params.addBodyParameter("type", bean.getFlag()+"");
        BaseModel.post(MyAPI.addchatfriend, params);

        //2.添加消息到本地消息表
        MsgDao.add(context, bean);

    }

    /**
     * 接受一个机器人的消息（语言库的消息）
     * 1.随机获取语言库
     * 2.封装消息
     * 3.添加消息到网络
     * 4.添加消息到本地
     */
    public static void receive(final Context context, final String jid, final String cid) {
        mLog.e("封装消息:" + "/1.随机获取语言库");

        initSoudPool(context);

        mLog.e("receive:" + "自己的语音库");
        //5.开启自动回复机制（10秒后启动线程）----自己的语音库
        //1.随机获取语言库
        BaseModel.setCallBackLister(new BaseModel.CallBackLister() {
            @Override
            public String onCallBack(String url, String data) {
                try {
                    //2.封装消息
                    getMessageResponse obj = new Gson().fromJson(data, getMessageResponse.class);
                    String msg = obj.getMessage();

                    //将语言库消息中的"XX"替换为定位的城市
                    String city = PreferencesUtils.getString(context, "city");
                    msg = msg.replace("XX", city);

                    String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
                    MSG bean = new MSG();
                    bean.setJid(jid);
                    bean.setCid(cid);
                    bean.setContent(msg);
                    bean.setTime(time);
                    bean.setFlag(MSG.RECEIVER);

                    Log.e("msg", "封装消息:" + new Gson().toJson(bean));

                    //3.4.添加消息到网络和本地
                    send(context, bean);

                    //消息提醒
                    // 播放音效
                    mLog.e("播放音效");
                    soundPool.play(aid, 1, 1, 0, 0, 1);


                    //5.配置数字相关
                    //判断当前的聊天状态
                    int liaoStatus = PreferencesUtils.getInt(context, "liaoStatus");
                    mLog.e("当前的聊天状态：liaoStatus=" + liaoStatus);
                    if (liaoStatus != 2) {
                        int temp = PreferencesUtils.getInt(context, jid + "MailNumber", 0);
                        temp++;
                        PreferencesUtils.putInt(context, jid + "MailNumber", temp);
                    }
                    //刷新聊天界面
                    if (mfindFaceLister != null) {
                        mfindFaceLister.haveFindFace();
                    }

                    //刷新信箱数字
                    NumberModel.refreshMailNumber(context);

                    // 广播通知
                    Intent intent = new Intent();
                    intent.setAction("action.refreshFriend");
                    context.sendBroadcast(intent);

                } catch (JsonSyntaxException e) {
                    mLog.e("随机获取语言库：出错：" + e.getMessage());
                }

                return url;
            }
        });
        RequestParams params = new RequestParams();

        int sexType = PreferencesUtils.getInt(context, "sexType");
        Log.e("test", "获取消息性别判定：cid性别为(0男1女)：" + sexType);
        switch (sexType) {
            case 0:
                params.addBodyParameter("Gender", "1");//1获取女性消息，2获取男性消息
                break;
            case 1:
                params.addBodyParameter("Gender", "2");//1获取女性消息，2获取男性消息
                break;
        }


        params.addBodyParameter("cishu", "1");//1第一次获取，2第二次获取
        params.addBodyParameter("id", jid);//机器人id
        params.addBodyParameter("cid", cid);//当前用户id
        BaseModel.post(MyAPI.getmessage, params);


    }


    /**
     * 接受一个机器人的消息（追加语言库的消息）
     * 1.随机获取语言库
     * 2.封装消息
     * 3.添加消息到网络
     * 4.添加消息到本地
     */
    public static void receiveMore(final Context context, final String jid, final String cid) {
        mLog.e("封装消息:" + "/1.随机获取追回语言库");

        initSoudPool(context);

        mLog.e("receive:" + "自己的语音库");
        //5.开启自动回复机制（40秒后启动线程）----追回的语音库
        //1.随机获取语言库
        BaseModel.setCallBackLister(new BaseModel.CallBackLister() {
            @Override
            public String onCallBack(String url, String data) {

                try {
                    //2.封装消息
                    getMessageResponse obj = new Gson().fromJson(data, getMessageResponse.class);
                    String msg = obj.getMessage();

                    //将语言库消息中的"XX"替换为定位的城市
                    String city = PreferencesUtils.getString(context, "city");
                    msg = msg.replace("XX", city);

                    String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
                    MSG bean = new MSG();
                    bean.setJid(jid);
                    bean.setCid(cid);
                    bean.setContent(msg);
                    bean.setTime(time);
                    bean.setFlag(MSG.RECEIVER);

                    Log.e("msg", "封装消息:" + new Gson().toJson(bean));

                    //3.4.添加消息到网络和本地
                    send(context, bean);

                    //消息提醒
                    // 播放音效
                    mLog.e("播放音效");
                    soundPool.play(aid, 1, 1, 0, 0, 1);


                    //5.配置数字相关
                    //判断当前的聊天状态
                    int liaoStatus = PreferencesUtils.getInt(context, "liaoStatus");
                    mLog.e("当前的聊天状态：liaoStatus=" + liaoStatus);
                    if (liaoStatus != 2) {
                        int temp = PreferencesUtils.getInt(context, jid + "MailNumber", 0);
                        temp++;
                        PreferencesUtils.putInt(context, jid + "MailNumber", temp);
                    }
                    //刷新聊天界面
                    if (mfindFaceLister != null) {
                        mfindFaceLister.haveFindFace();
                    }

                    //刷新信箱数字
                    NumberModel.refreshMailNumber(context);


                    // 广播通知
                    Intent intent = new Intent();
                    intent.setAction("action.refreshFriend");
                    context.sendBroadcast(intent);

                } catch (JsonSyntaxException e) {
                    mLog.e("随机获取语言库：出错：" + e.getMessage());
                }

                return url;
            }
        });
        RequestParams params = new RequestParams();

        int sexType = PreferencesUtils.getInt(context, "sexType");
        Log.e("test", "获取消息性别判定：cid性别为(0男1女)：" + sexType);
        switch (sexType) {
            case 0:
                params.addBodyParameter("Gender", "1");//1获取女性消息，2获取男性消息
                break;
            case 1:
                params.addBodyParameter("Gender", "2");//1获取女性消息，2获取男性消息
                break;
        }

        params.addBodyParameter("cishu", "2");//1第一次获取，2第二次获取
        params.addBodyParameter("id", jid);//机器人id
        params.addBodyParameter("cid", cid);//当前用户id


        BaseModel.post(MyAPI.getmessage, params);


    }

    /**
     * 接受一个机器人的消息（图灵机器人的消息）
     * 1.图灵机器人的消息
     * 2.封装消息
     * 3.添加消息到网络
     * 4.添加消息到本地
     */
    public static void receiveWithTuling(final Context context, final String jid, final String cid, String info, final MsgLister mListener) {
        mLog.e("封装消息:" + "图灵机器人的消息");

        initSoudPool(context);

        //5.开启自动回复机制（30秒后启动线程）-----图灵机器人

        mLog.e("receive:" + "图灵机器人");


        String url = "";

        String weburl = "http://www.tuling123.com/openapi/api";

//        String appkey="5f20539703b7aac79e192fe025528ba9";//我自己的图灵
        String appkey = MyConfig.tulingAPI;//客户的图灵

//        http://www.tuling123.com/openapi/api?key=5f20539703b7aac79e192fe025528ba9&info=%E5%8D%81%E5%88%86%E5%85%B3%E5%BF%83


        info = info.replaceAll(" ", ",");
        url = weburl + "?key=" + appkey + "&info=" + info;

        BaseModel.setCallBackLister(new BaseModel.CallBackLister() {

            @Override

            public String onCallBack(String url, String result) {

                try {

                    //2.封装消息

                    TulingText obj = new Gson().fromJson(result, TulingText.class);

                    String msg = obj.getText();

                    String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());

                    MSG bean = new MSG();

                    bean.setJid(jid);

                    bean.setCid(cid);

                    bean.setContent(msg);

                    bean.setTime(time);

                    bean.setFlag(MSG.RECEIVER);


                    Log.e("msg", "图灵机器人封装消息:" + new Gson().toJson(bean));


                    //3.4.添加消息到网络和本地

                    send(context, bean);


                    //消息提醒

                    // 播放音效

                    mLog.e("图灵机器人播放音效");

                    soundPool.play(aid, 1, 1, 0, 0, 1);


                    //5.配置数字相关

                    //判断当前的聊天状态

                    int liaoStatus = PreferencesUtils.getInt(context, "liaoStatus");

                    mLog.e("当前的聊天状态：liaoStatus=" + liaoStatus);

                    if (liaoStatus != 2) {

                        int temp = PreferencesUtils.getInt(context, jid + "MailNumber", 0);

                        temp++;

                        PreferencesUtils.putInt(context, jid + "MailNumber", temp);

                    }

                    //刷新聊天界面
                    mListener.onRecive();

//                    if (mfindFaceLister != null) {
//
//                        mfindFaceLister.haveFindFace();
//
//                    }


                    // 广播通知
                    Intent intent = new Intent();
                    intent.setAction("action.refreshFriend");
                    context.sendBroadcast(intent);


                } catch (JsonSyntaxException e) {

                    mLog.e("图灵机器人：出错：" + e.getMessage());

                }

                return url;
            }

        });

        BaseModel.get(url);


    }



    /**
     * 接受一个机器人的消息（图灵机器人的消息）
     * 1.图灵机器人的消息
     * 2.封装消息
     * 3.添加消息到网络
     * 4.添加消息到本地
     */
    public static void receiveWithTuling(final Context context, final String jid, final String cid, String info) {
        mLog.e("封装消息:" + "图灵机器人的消息");

        initSoudPool(context);

        //5.开启自动回复机制（30秒后启动线程）-----图灵机器人

        mLog.e("receive:" + "图灵机器人");


        String url = "";

        String weburl = "http://www.tuling123.com/openapi/api";

//        String appkey="5f20539703b7aac79e192fe025528ba9";//我自己的图灵
        String appkey = MyConfig.tulingAPI;//客户的图灵

//        http://www.tuling123.com/openapi/api?key=5f20539703b7aac79e192fe025528ba9&info=%E5%8D%81%E5%88%86%E5%85%B3%E5%BF%83


        info = info.replaceAll(" ", ",");
        url = weburl + "?key=" + appkey + "&info=" + info;

        BaseModel.setCallBackLister(new BaseModel.CallBackLister() {

            @Override

            public String onCallBack(String url, String result) {

                try {

                    //2.封装消息

                    TulingText obj = new Gson().fromJson(result, TulingText.class);

                    String msg = obj.getText();

                    String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());

                    MSG bean = new MSG();

                    bean.setJid(jid);

                    bean.setCid(cid);

                    bean.setContent(msg);

                    bean.setTime(time);

                    bean.setFlag(MSG.RECEIVER);


                    Log.e("msg", "图灵机器人封装消息:" + new Gson().toJson(bean));


                    //3.4.添加消息到网络和本地

                    send(context, bean);


                    //消息提醒

                    // 播放音效

                    mLog.e("图灵机器人播放音效");

                    soundPool.play(aid, 1, 1, 0, 0, 1);


                    //5.配置数字相关

                    //判断当前的聊天状态

                    int liaoStatus = PreferencesUtils.getInt(context, "liaoStatus");

                    mLog.e("当前的聊天状态：liaoStatus=" + liaoStatus);

                    if (liaoStatus != 2) {

                        int temp = PreferencesUtils.getInt(context, jid + "MailNumber", 0);

                        temp++;

                        PreferencesUtils.putInt(context, jid + "MailNumber", temp);

                    }

                    //刷新聊天界面

                    if (mfindFaceLister != null) {

                        mfindFaceLister.haveFindFace();

                    }


                    // 广播通知
//                    Intent intent = new Intent();
//                    intent.setAction("action.refreshFriend");
//                    context.sendBroadcast(intent);


                } catch (JsonSyntaxException e) {

                    mLog.e("图灵机器人：出错：" + e.getMessage());

                }

                return url;
            }

        });

        BaseModel.get(url);


    }




    /**
     * 接受一个机器人的消息（消息已有）
     * 1.图灵机器人的消息
     * 2.封装消息
     * 3.添加消息到网络
     * 4.添加消息到本地
     */
    public static void receiveWithMsg(final Context context, final String jid, final String cid, String msg) {
        mLog.e("封装消息:" + "群打招呼回复");

        //将语言库消息中的"XX"替换为定位的城市
        String city = PreferencesUtils.getString(context, "city");
        msg = msg.replace("XX", city);




        //5.开启自动回复机制（30秒后启动线程）-----图灵机器人

        try {

            //2.封装消息


            String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());

            MSG bean = new MSG();

            bean.setJid(jid);

            bean.setCid(cid);

            bean.setContent(msg);

            bean.setTime(time);

            bean.setFlag(MSG.RECEIVER);


            Log.e("msg", "群打招呼回复封装消息:" + new Gson().toJson(bean));


            //3.4.添加消息到网络和本地

            send(context, bean);


            //消息提醒

            // 播放音效

            mLog.e("群打招呼回复播放音效");




            //5.配置数字相关

            //判断当前的聊天状态

            int liaoStatus = PreferencesUtils.getInt(context, "liaoStatus");

            mLog.e("当前的聊天状态：liaoStatus=" + liaoStatus);

            if (liaoStatus != 2) {

                int temp = PreferencesUtils.getInt(context, jid + "MailNumber", 0);

                temp++;

                PreferencesUtils.putInt(context, jid + "MailNumber", temp);

            }
//
//            //刷新聊天界面
//
//            if (mfindFaceLister != null) {
//
//                mfindFaceLister.haveFindFace();
//
//            }

            //刷新信箱数字
            NumberModel.refreshMailNumber(context);


            // 广播通知
            Intent intent = new Intent();
            intent.setAction("action.refreshFriend");
            context.sendBroadcast(intent);


        } catch (Exception e) {

            mLog.e("群打招呼回复：出错：" + e.getMessage());

        }



    }

    /**
     * 定义一个接口
     */
    public interface MsgLister {
        public void onRecive();
    }


    //自定义一个回调方法

    /**
     * 定义一个接口
     */
    public interface findFaceLister {
        public void haveFindFace();
    }

    /**
     * 初始化接口变量
     */
    private static findFaceLister mfindFaceLister = null;

    /**
     * 自定义控件的自定义事件
     */
    public static void setfindFaceLister(findFaceLister mfindFaceLister2) {
        mfindFaceLister = mfindFaceLister2;
    }

    //提醒音效
    private static SoundPool soundPool;
    static int aid;

    //准备音效资源
    public static void initSoudPool(Context context) {
        /***
         *  开始音效（SoudPool实现）
         */
        // 创建SoudPool的对象（最大音乐数目，音乐的类型，音乐的品质）
        soundPool = new SoundPool(10, AudioManager.STREAM_SYSTEM, 5);
//        // 加载音乐
        aid = soundPool.load(context, R.raw.notify02, 1);
    }


    /**
     * 通过图灵机器人获得回复
     *
     * @param info
     */
    private void getMessageWithTuling(String info) {
        info = info.replaceAll(" ", ",");
        String url = "";
        String weburl = "http://www.tuling123.com/openapi/api";
        String appkey = "5f20539703b7aac79e192fe025528ba9";
//        http://www.tuling123.com/openapi/api?key=5f20539703b7aac79e192fe025528ba9&info=%E5%8D%81%E5%88%86%E5%85%B3%E5%BF%83
        url = weburl + "?key=" + appkey + "&info=" + info;
        BaseModel.setCallBackLister(new BaseModel.CallBackLister() {
            @Override
            public String onCallBack(String url, String result) {

                return url;
            }
        });
        BaseModel.get(url);

    }


    //自定义一个回调方法

    /**
     * 定义一个接口
     */
    public interface GetMemberTypeLister {
        public void onSuccess(USER user);
    }

    /**
     * 初始化接口变量
     */
    private static GetMemberTypeLister mLister = null;

    /**
     * 自定义控件的自定义事件
     */
    public static void setGetMemberTypeLister(GetMemberTypeLister mLister2) {
        mLister = mLister2;
    }


}
